package com.foton.bpc.all.remoting.invoker.proxy;

import com.foton.bpc.all.remoting.dto.BpcInvacation;
import com.foton.bpc.all.remoting.invoker.Invoker;
import org.omg.CORBA.OBJ_ADAPTER;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author RenPu
 * @Date 2023/6/8 18:45
 * @Version 1.0
 * @Description: 静态代理工厂
 **/
public class ProxyFactroy {


    /**
     * 供服务调用者  调用（获取代理对象）使用JDK得动态代理方式
      * @param invoker
     * @param interfaces
     * @return
     */
   public static Object getProxy(Invoker invoker,Class<?>[] interfaces){
       return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
               interfaces,
               new InvokerInvocationHandler(invoker));
   }



    /**
     *  供服务提供者（进行暴露服务）
     * @param proxy
     * @param type
     * @return
     */
    public static Invoker getInvoker(Object proxy,Class<?>type){

        System.out.println("1111111111111111111111111");
        return new Invoker() {
            @Override
            public Class<?> getInterface() {
                return type;
            }

            @Override
            public Object invoker(BpcInvacation bpcInvacation) throws Exception {
                Method method = proxy.getClass().getMethod(bpcInvacation.getMethodName(),bpcInvacation.getParamTypes());
                return method.invoke(proxy,bpcInvacation.getArguments());
            }
        };



    }




}
